package pe.com.hatunsol.hatun_android;

import static pe.com.hatunsol.hatun_android.utilitario.Util.*;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import pe.com.hatunsol.hatun_android.adapter.LocalListAdapter;
import pe.com.hatunsol.hatun_android.dao.DataBaseHelper;
import pe.com.hatunsol.hatun_android.dao.EstablecimientoDAO;
import pe.com.hatunsol.hatun_android.dao.LocalDAO;
import pe.com.hatunsol.hatun_android.dao.TipoEstablecimientoDAO;
import pe.com.hatunsol.hatun_android.dialogframent.AceptarDialogfragment;
import pe.com.hatunsol.hatun_android.entity.Establecimiento;
import pe.com.hatunsol.hatun_android.entity.Local;
import pe.com.hatunsol.hatun_android.entity.TipoEstablecimiento;

public class AfilicacionEstablecimientoActivity extends ActionBarActivity {

    private EditText etRazonSocial;
    private EditText etRuc;
    private Spinner spTipo;
    private EditText etRepresentante;
    private EditText etDni;
    private EditText etTelefono;
    private EditText etObservaciones;
    private Button btAgregar;
    private ListView lvLocal;

    private LocalListAdapter localListAdapter;
    private LocalDAO localDAO;
    private TipoEstablecimientoDAO tipoEstablecimientoDAO;
    private EstablecimientoDAO establecimientoDAO;
    private List<Local> locales;

    private long idEstablecimiento;

    private static final int ADD_LOCAL_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_afilicacion_establecimiento);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

        etRazonSocial = (EditText) findViewById(R.id.etRazonSocial);
        etRuc = (EditText) findViewById(R.id.etRuc);
        spTipo = (Spinner) findViewById(R.id.spTipo);
        etRepresentante = (EditText) findViewById(R.id.etRepresentante);
        etDni = (EditText) findViewById(R.id.etDni);
        etTelefono = (EditText) findViewById(R.id.etTelefono);
        etObservaciones = (EditText) findViewById(R.id.etObservaciones);
        btAgregar = (Button) findViewById(R.id.btAgregar);
        lvLocal = (ListView) findViewById(R.id.lvLocal);

        try {
            DataBaseHelper dataBaseHelper = new DataBaseHelper(AfilicacionEstablecimientoActivity.this);
            dataBaseHelper.createDataBase();
            dataBaseHelper.openDataBase();
        } catch (Exception ex) {
            Toast.makeText(AfilicacionEstablecimientoActivity.this, "No se pudo copiar.", Toast.LENGTH_SHORT).show();
        }

        localDAO = new LocalDAO();
        tipoEstablecimientoDAO = new TipoEstablecimientoDAO();
        establecimientoDAO = new EstablecimientoDAO();

        List<TipoEstablecimiento> tipoEstablecimientoList = tipoEstablecimientoDAO.list();
        ArrayAdapter<TipoEstablecimiento> tipoDataAdapter = new ArrayAdapter<>
                (AfilicacionEstablecimientoActivity.this, android.R.layout.simple_spinner_item, tipoEstablecimientoList);
        tipoDataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spTipo.setAdapter(tipoDataAdapter);

        idEstablecimiento = getIntent().getExtras().getLong("idEstablecimiento");
        if (idEstablecimiento == 0) {
            locales = new ArrayList<>();
        } else {
            Establecimiento establecimiento = establecimientoDAO.getById(idEstablecimiento);
            locales = localDAO.getByIdEstablecimiento(idEstablecimiento);
            etRazonSocial.setText(establecimiento.getRazonSocial());
            etRuc.setText(establecimiento.getRuc());
            int positionTipo = tipoDataAdapter.getPosition(new TipoEstablecimiento(establecimiento.getTipoEstablecimiento()));
            spTipo.setSelection(positionTipo);
            etRepresentante.setText(establecimiento.getRepresentante());
            etDni.setText(establecimiento.getDni());
            etTelefono.setText(establecimiento.getTelefono());
            etObservaciones.setText(establecimiento.getObservaciones());
        }

        localListAdapter = new LocalListAdapter(AfilicacionEstablecimientoActivity.this, 0, locales);
        lvLocal.setAdapter(localListAdapter);

        btAgregar.setOnClickListener(btAgregarOnClickListener);

        final SwipeDetector swipeDetector = new SwipeDetector();
        lvLocal.setOnTouchListener(swipeDetector);
        lvLocal.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {
                if (swipeDetector.swipeDetected()) {
                    if (swipeDetector.getAction() == SwipeDetector.Action.LR) {
                        if (idEstablecimiento == 0) {
                            locales.remove(position);
                            localListAdapter.notifyDataSetChanged();
                        } else {
                            Local local = locales.get(position);
                            localDAO.delete(local.getId());
                            locales = localDAO.getByIdEstablecimiento(idEstablecimiento);
                            localListAdapter = new LocalListAdapter(AfilicacionEstablecimientoActivity.this, 0, locales);
                            lvLocal.setAdapter(localListAdapter);
                        }
                    }
                }
            }
        });
    }

    View.OnClickListener btAgregarOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(AfilicacionEstablecimientoActivity.this, AgregarLocalActivity.class);
            intent.putExtra("idEstablecimiento", idEstablecimiento);
            startActivityForResult(intent, ADD_LOCAL_REQUEST_CODE);
        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_afilicacion_establecimiento, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.ic_action_save:
                if (!isValid()) break;
                if (idEstablecimiento == 0) {
                    Establecimiento establecimiento = new Establecimiento();
                    establecimiento.setObservaciones(etObservaciones.getText().toString());
                    establecimiento.setTelefono(etTelefono.getText().toString());
                    establecimiento.setDni(etDni.getText().toString());
                    establecimiento.setTipoEstablecimiento(((TipoEstablecimiento)spTipo.getSelectedItem()).getId());
                    establecimiento.setRuc(etRuc.getText().toString());
                    establecimiento.setRepresentante(etRepresentante.getText().toString());
                    establecimiento.setRazonSocial(etRazonSocial.getText().toString());
                    long id = establecimientoDAO.insert(establecimiento);
                    for (Local local : locales) {
                        local.setIdEstablecimiento(id);
                        localDAO.insert(local);
                    }
                } else {
                    Establecimiento establecimiento = new Establecimiento();
                    establecimiento.setObservaciones(etObservaciones.getText().toString());
                    establecimiento.setTelefono(etTelefono.getText().toString().trim());
                    establecimiento.setDni(etDni.getText().toString().trim());
                    establecimiento.setTipoEstablecimiento(((TipoEstablecimiento)spTipo.getSelectedItem()).getId());
                    establecimiento.setRuc(etRuc.getText().toString().trim());
                    establecimiento.setRepresentante(etRepresentante.getText().toString().trim());
                    establecimiento.setId(idEstablecimiento);
                    establecimiento.setRazonSocial(etRazonSocial.getText().toString().trim());
                    establecimientoDAO.update(establecimiento);
                }

                Intent intent = new Intent(AfilicacionEstablecimientoActivity.this, ListaEstablecimientoActivity.class);
                startActivity(intent);
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private boolean isValid() {
        boolean isValid = true;
        String message = "";
        if (etRazonSocial.getText().toString().isEmpty()) {
            message = "Ingrese la Razón Social";
            isValid = false;
        } else if (etRuc.getText().toString().trim().length() != 11
                || !isNumber(etRuc.getText().toString().trim())) {
            message = "Ingrese un RUC válido";
            isValid = false;
        } else if (etRepresentante.getText().toString().isEmpty()) {
            message = "Ingrese Representante";
            isValid = false;
        } else if (etDni.getText().toString().trim().length() != 8
                || !isNumber(etDni.getText().toString().trim())) {
            message = "Ingrese un DNI válido";
            isValid = false;
        } else if (etTelefono.getText().toString().isEmpty()) {
            message = "Ingrese teléfono";
            isValid = false;
        }
        if (!isValid) {
            AceptarDialogfragment confirmacionDialogfragment = new AceptarDialogfragment();
            confirmacionDialogfragment.setMensaje(message);
            confirmacionDialogfragment.setmConfirmacionDialogfragmentListener(dismissListener);
            confirmacionDialogfragment.show(getSupportFragmentManager(), AceptarDialogfragment.TAG);
        }
        return isValid;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ADD_LOCAL_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Local local = (Local) data.getExtras().getSerializable("local");
                if (idEstablecimiento == 0) {
                    locales.add(local);
                    localListAdapter.notifyDataSetChanged();
                } else {
                    localDAO.insert(local);
                    locales = localDAO.getByIdEstablecimiento(idEstablecimiento);
                    localListAdapter = new LocalListAdapter(AfilicacionEstablecimientoActivity.this, 0, locales);
                    lvLocal.setAdapter(localListAdapter);
                }
            }
        }
    }

    AceptarDialogfragment.AceptarDialogfragmentListener dismissListener = new AceptarDialogfragment.AceptarDialogfragmentListener() {
        @Override
        public void onConfirmacionOK() {
            // Do Nothing
        }
    };

}
